package leetcode.editor.cn;

import java.util.HashMap;
import java.util.Set;

/**
 * [1763]最长的美好子字符串
 * longest-nice-substring
 */
//当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中，就称这个字符串 s 是 美好 字符串。比方说，"abABB" 是美好字符串，因为 
//'A' 和 'a' 同时出现了，且 'B' 和 'b' 也同时出现了。然而，"abA" 不是美好字符串因为 'b' 出现了，而 'B' 没有出现。 
//
// 给你一个字符串 s ，请你返回 s 最长的 美好子字符串 。如果有多个答案，请你返回 最早 出现的一个。如果不存在美好子字符串，请你返回一个空字符串。 
//
// 示例 1：
//输入：s = "YazaAay"
//输出："aAa"
//解释："aAa" 是一个美好字符串，因为这个子串中仅含一种字母，其小写形式 'a' 和大写形式 'A' 也同时出现了。
//"aAa" 是最长的美好子字符串。
// 
//
// 示例 2：
//输入：s = "Bb"
//输出："Bb"
//解释："Bb" 是美好字符串，因为 'B' 和 'b' 都出现了。整个字符串也是原字符串的子字符串。 
//
// 示例 3：
//输入：s = "c"
//输出：""
//解释：没有美好子字符串。 
//
// 示例 4：
//输入：s = "dDzeE"
//输出："dD"
//解释："dD" 和 "eE" 都是最长美好子字符串。
//由于有多个美好子字符串，返回 "dD" ，因为它出现得最早。 
//
// 
//
// 提示：
// 1 <= s.length <= 100 
// s 只包含大写和小写英文字母。 
// 
// Related Topics 位运算 哈希表 字符串 滑动窗口 
// 👍 112 👎 0

public class LC1763_最长的美好子字符串 {
    public static void main(String[] args) {
        Solution solution = new LC1763_最长的美好子字符串().new Solution();
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String longestNiceSubstring(String s) {
            HashMap<Character, Integer> windowMap = new HashMap<>();
            HashMap<Character, Integer> needMap = new HashMap<>();
            int left = 0, right = 0, valid = 0;
            int start = 0, result_length = 0;
            while (right < s.length()) {
                char c_in = s.charAt(right++);
                windowMap.put(c_in, windowMap.getOrDefault(c_in, 0) + 1);
                windowMap.put(toggleCase(c_in), windowMap.getOrDefault(toggleCase(c_in), 0));
                //需求中不存在进入的字符
                if (needMap.get(c_in) == null && needMap.get(toggleCase(c_in)) == null) {
                    needMap.put(c_in, 1);
                    needMap.put(toggleCase(c_in), 1);
                }
                //需求中存在进入的字符
                else {
                    if (windowMap.get(toggleCase(c_in)) != null) {
                        //开始检查是否满足美好字符串
                        //YazaAa
                        while(true){
                            Set<Character> needKey = needMap.keySet();
                            for (Character key : needKey) {
                                if (!(windowMap.get(key) > 0)){
                                    char c_out = s.charAt(left++);
                                    windowMap.put(c_out,windowMap.get(c_out) - 1);
                                    if (windowMap.get(c_out) == 0 && windowMap.get(toggleCase(c_out)) == 0){
                                        needMap.remove(c_out);
                                        needMap.remove(c_out);
                                    }
                                    break;
                                }

                            }
                        }
                    }
                }
            }
            return null;
        }

        //大小写转换方法，传入大写返回小写，传入小写返回大写
        private char toggleCase(char c) {
            if (Character.isLowerCase(c)) {
                return (char) (c + 32);//小写转大写
            } else {
                return (char) (c - 32);//大写转小写
            }
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}